Return to Spatial Page

\(\color{darkblue}{\textbf{Remote Sensing}}\)



\(\color{dodgerblue}{\textbf{Passive Sensors}}\)


\(\color{skyblue}{\textrm{- Night Lights}}\)

Name Defense Meteorological Satellite Program (DMSP), Operational Line Scanner(OLS) Suomi National Polar Orbiting Partnership (NPP), Visible Infrared Imaging Radiometer Suite (VIIRS)
Satellite
Availability 1992 to 2014 2011 to Present
Spatial Resolution 1 km 0.5 km
Temporal Resolution Daily (yearly on GEE) Daily (monthly on GEE)
Radiance Digital Number (DN) 6 bit numbers (0 - 64) 7 bit numbers (0 - 128)
//Use SRTM elevation data to remove pixels that represent oceans
var elev = ee.Image('srtm90_v4');
var elevation_mask = elev.mask();

// --------------------------------
// ----- DMSP ---------------------
// --------------------------------

//Select time
//DMSP is avaiable between 1992 and 2012 (yearly)
var DMSP_T1_a = '1993-01-01';
var DMSP_T1_b = '1993-12-31';
var DMSP_T2_a = '2012-01-01';
var DMSP_T2_b = '2012-12-31';

//Load data
var DMSP = ee.ImageCollection('NOAA/DMSP-OLS/NIGHTTIME_LIGHTS')
             .select('stable_lights');

//Transform to Image using .mean as reducer and .updateMask to remove ocean pixels
var DMSP_T1 = DMSP.filterDate(DMSP_T1_a, DMSP_T1_b).mean()
                  .updateMask(elevation_mask); 
                  
var DMSP_T2 = DMSP.filterDate(DMSP_T2_a, DMSP_T2_b).mean()
                  .updateMask(elevation_mask);

//Calculate change 
var DMSP_change = DMSP_T2.subtract(DMSP_T1);

//Display maps
Map.addLayer(DMSP_T1, {min:0, max:64}, 'DMSP T1');
Map.addLayer(DMSP_T2, {min:0, max:64}, 'DMSP T2');
Map.addLayer(DMSP_change, {min:-20, max:20 , palette: ['blue', 'white', 'red']}, 'DMSP T2-T1 rad');


// --------------------------------
// ----- VIRRS --------------------
// --------------------------------

//Select time
//VIRRS is available between 2012 and present (monthly)
var VIIRS_T1_a = '2012-09-01';
var VIIRS_T1_b = '2012-10-31';
var VIIRS_T2_a = '2020-09-01';
var VIIRS_T2_b = '2020-10-31';

//Load data
var VIIRS = ee.ImageCollection('NOAA/VIIRS/DNB/MONTHLY_V1/VCMCFG')
              .filterDate('2012-01-01', '2021-12-31')
              .select('avg_rad');

// Transform to Image using .mean as reducer and .updateMask to remove ocean pixels
var VIIRS_T1 = VIIRS.filterDate(VIIRS_T1_a, VIIRS_T1_b).mean()
                    .updateMask(elevation_mask);

var VIIRS_T2 = VIIRS.filterDate(VIIRS_T2_a, VIIRS_T2_b).mean()
                    .updateMask(elevation_mask);

//Calculate change 
var VIIRS_change = VIIRS_T2.subtract(VIIRS_T1);

//Display maps
Map.addLayer(VIIRS_T1, {min:0, max:128}, 'VIIRS T1');
Map.addLayer(VIIRS_T2, {min:0, max:128}, 'VIIRS T2');
Map.addLayer(VIIRS_change, {min:-20, max:20 , palette: ['blue', 'white', 'red']}, 'VIIRS T2-T1');

//*--------------------------------------
//Notes:
//DMSP used 6 bit numbers (0 - 64) while VIIRS usss 7 bit number (0-128)
//The gain for DMSP is high so there will be saturation in bright areas

//Select ROI
var ROI = ee.FeatureCollection("users/rmb623/nyc");
Map.addLayer(ROI, {}, 'ROI', 0);
Map.centerObject(ROI, 9);

//Calculate ROI area in km2
print('ROI Area km2', ROI.geometry().area().divide(1e6));

//DMSP ROI
var DMSP_chart = ui.Chart.image.seriesByRegion(
  DMSP, 
  ROI.geometry(), 
  ee.Reducer.mean())
  .setOptions({title: 'DMSP Night Light Radiance',
               hAxis: {title: 'Year', 
                       titleTextStyle: {italic: false, bold: true}},
               vAxis: {title: 'Intensity', 
                       minValue: 0},
               colors: ['red']});
print(DMSP_chart);

//VIIRS ROI
var VIIRS_chart = ui.Chart.image.seriesByRegion(
  VIIRS, 
  ROI.geometry(), 
  ee.Reducer.mean())
  .setOptions({title: 'VIIRS Night Light Radiance',
               hAxis: {title: 'Month', 
                       titleTextStyle: {italic: false, bold: true}},
               vAxis: {title: 'Intensity', 
                       minValue: 0},
               colors: ['red']});
print(VIIRS_chart);


\(\color{skyblue}{\textrm{- Normalized Difference Vegetation Index}}\)

Name National Agriculture Imagery (NAIP) Sentinel-2 Landsat (1-9)
Satellite
Availability 2006, 2009, 2011, 2013, 2015, 2017, 2019 2016 - present 1999 - present
Coverage Continental US Global Global
Spatial Resolution 1 m 10 m 30 m
Temporal Resolution Yearly mosaic 10 days (5 days from 2019) 16 days
Spectral Bands 4 13 11
NDVI Bands R + IR B4 (665 nm) + B8 (833 nm) B4 (660 nm) + B5 (860 nm)
// --------------------------------
// ----- NAIP ---------------------
// --------------------------------

//Select ROI
var ROI = ee.FeatureCollection("users/rmb623/nyc");
Map.addLayer(ROI, {}, 'ROI', 0);
Map.centerObject(ROI, 9);

//Select time
//Yearly mosaics of 2006, 2009, 2011, 2013, 2015, 2017, 2019
var N_T1_a = '2011-01-01';
var N_T1_b = '2011-12-31';
var N_T2_a = '2015-01-01';
var N_T2_b = '2015-12-31';

//Get RGB visual imagery for ROI
var NAIP = ee.ImageCollection('USDA/NAIP/DOQQ').filterBounds(ROI);
var NAIP_T1 = NAIP.filterDate(N_T1_a, N_T1_b).mosaic().clip(ROI);
var NAIP_T2 = NAIP.filterDate(N_T2_a, N_T2_b).mosaic().clip(ROI);

//Plot red, green, and blue bands
Map.addLayer(NAIP_T1, {min: 0, max: 255, bands:['R','G','B']}, 'NAIP T1', 0);
Map.addLayer(NAIP_T2, {min: 0, max: 255, bands:['R','G','B']}, 'NAIP T2', 1);

//Calculate NDVI using red (R) and Near Infrared Band (N) 
var NDVI_NAIP_T1 = NAIP_T1.normalizedDifference(['N', 'R']).rename('NDVI_NAIP');
var NDVI_NAIP_T2 = NAIP_T2.normalizedDifference(['N', 'R']).rename('NDVI_NAIP');

//Plot NDVI
Map.addLayer(NDVI_NAIP_T1, {min: -0.4, max: 0.6, palette: ['brown','white', 'green']}, 'NAIP NDVI T1 1m', 0);
Map.addLayer(NDVI_NAIP_T2, {min: -0.4, max: 0.6, palette: ['brown','white', 'green']}, 'NAIP NDVI T2 1m', 1);

//Plot NDVI histogram between T1 and T2
var NDVI_T1_T2 = NDVI_NAIP_T1.addBands(NDVI_NAIP_T2);
var ndvi_naip = ui.Chart.image.histogram({
   image: NDVI_T1_T2, 
   region: ROI, 
   scale: 3, 
   maxPixels: 1e13})
  .setSeriesNames(['NAIP T1', 'NAIP T2'])
  .setOptions({title: 'NAIP NDVI Histograms for T1 and T2',
               hAxis: {title: 'NDVI', 
                       titleTextStyle: {italic: false, bold: true}},
               vAxis: {title: 'Count', 
                       titleTextStyle: {italic: false, bold: true}},
               colors: ['cf513e', '1d6b99'],
               opacity:[0.1,0.2]});
print(ndvi_naip);

// --------------------------------
// ----- Sentinel -----------------
// --------------------------------

//Select ROI
var ROI = ee.FeatureCollection("users/rmb623/nyc");
Map.addLayer(ROI, {}, 'ROI', 0);
Map.centerObject(ROI, 9);

//Select time
//Revisit time of 10 days 2016-2018, 5 days 2019-present
var S_T1_a = '2016-5-01';
var S_T1_b = '2016-9-30';
var S_T2_a = '2020-5-01';
var S_T2_b = '2020-9-30';

//Function to mask clouds using the detected cloud band "QA60"
var maskcloud_s2 = function(image) {
  var QA60 = image.select(['QA60']);
    return image
    .updateMask(QA60.lt(1));
};

//Get RGB visual imagery for ROI
var sentinel = ee.ImageCollection('COPERNICUS/S2')
  .filter(ee.Filter.lt('CLOUDY_PIXEL_PERCENTAGE', 10)) // filter to only less cloudy images
  .filterBounds(ROI)
  .map(maskcloud_s2); // apply the function to all images

//Use median instead of mosaic to ensure that the low lying clouds are removed 
var sentinel_T1 = sentinel.filterDate(S_T1_a,S_T1_b).median().clip(ROI);
var sentinel_T2 = sentinel.filterDate(S_T2_a,S_T2_b).median().clip(ROI);

//Plot red (B4), green (B3), and blue (B2) bands
Map.addLayer(sentinel_T1 ,{bands:['B4','B3','B2'], min:0,max:2500}, 'Sentinel 2 T1', 0);
Map.addLayer(sentinel_T2 ,{bands:['B4','B3','B2'], min:0,max:2500}, 'Sentinel 2 T2', 0);

//Calculate NDVI using red (B4) and Near Infrared Band (B8)
var ndvi_sentinel_t1 = sentinel_T1.normalizedDifference(['B8', 'B4']).rename('NDVI_Sentinel');
var ndvi_sentinel_t2 = sentinel_T2.normalizedDifference(['B8', 'B4']).rename('NDVI_Sentinel');

Map.addLayer(ndvi_sentinel_t1, {min:-0.3, max:0.8, palette: ['brown', 'white', 'green']}, 'Sentinel 2 NDVI T1 10m', 0);
Map.addLayer(ndvi_sentinel_t2, {min:-0.3, max:0.8, palette: ['brown', 'white', 'green']}, 'Sentinel 2 NDVI T2 10m', 0);

//Plot NDVI histogram between T1 and T2
var NDVI_T1_T2 = ndvi_sentinel_t1.addBands(ndvi_sentinel_t2);
var ndvi_sentinel = ui.Chart.image.histogram({
  image: NDVI_T1_T2, 
  region: ROI, 
  scale: 10, 
  maxPixels: 1e13})
  .setSeriesNames(['SENTINEL T1', 'SENTINEL T2'])
  .setOptions({title: 'SENTINEL 2 NDVI Histograms for T1 and T2',
               hAxis: {title: 'NDVI', 
                       titleTextStyle: {italic: false, bold: true}},
               vAxis: {title: 'Count', 
                       titleTextStyle: {italic: false, bold: true}},
               colors: ['cf513e', '1d6b99']});
print(ndvi_sentinel);

// --------------------------------
// ----- LANDSAT ------------------
// --------------------------------

//Select ROI
var ROI = ee.FeatureCollection("users/rmb623/nyc");
Map.addLayer(ROI, {}, 'ROI', 0);
Map.centerObject(ROI, 9);

//Select time
//Revisit time of 16 days 1999 - present
var L_T1_a = '2003-5-01';
var L_T1_b = '2003-9-30';
var L_T2_a = '2015-5-01';
var L_T2_b = '2015-9-30';

//Function to mask clouds
var maskcloud_L = function(image) {
  var qa = image.select('pixel_qa');
  // If the cloud bit (5) is set and the cloud confidence (7) is high
  // or if the cloud shadow bit is set (3), then it's a bad pixel.
  var cloud = qa.bitwiseAnd(1 << 5)
                  .and(qa.bitwiseAnd(1 << 7))
                  .or(qa.bitwiseAnd(1 << 3));
  // Remove edge pixels that don't occur in all bands
  var mask2 = image.mask().reduce(ee.Reducer.min());
  return image.updateMask(cloud.not()).updateMask(mask2);
};

//Get RGB visual imagery for ROI
var landsat = ee.ImageCollection('LANDSAT/LE07/C01/T1_SR').map(maskcloud_L).filterBounds(ROI);
var landsat_T1 = landsat.filterDate(L_T1_a,L_T1_b).median().clip(ROI);
var landsat_T2 = landsat.filterDate(L_T2_a,L_T2_b).median().clip(ROI);

//Plot red (B3), green (B2), and blue (B1) bands
Map.addLayer(landsat_T1 ,{bands:['B3','B2','B1'], min:0,max:2500}, 'Landsat 7 T1', 0);
Map.addLayer(landsat_T2 ,{bands:['B3','B2','B1'], min:0,max:2500}, 'Landsat 7 T2', 0);

//Calculate NDVI using red (B3) and Near Infrared Band (B4)
var landsat_ndvi_t1 = landsat_T1.normalizedDifference(['B4', 'B3']).rename('NDVI_Landsat_T1');
var landsat_ndvi_t2 = landsat_T2.normalizedDifference(['B4', 'B3']).rename('NDVI_Landsat_T2');

Map.addLayer(landsat_ndvi_t1, {min:-0.15, max:0.7, palette: ['brown', 'white', 'green']}, 'Landsat NDVI T1 30m', 0);
Map.addLayer(landsat_ndvi_t2, {min:-0.15, max:0.7, palette: ['brown', 'white', 'green']}, 'Landsat NDVI T2 30m', 0);

//Plot NDVI histogram between T1 and T2
var NDVI_T1_T2 = landsat_ndvi_t1.addBands(landsat_ndvi_t2);
var ndvi_landsat = ui.Chart.image.histogram({
  image: NDVI_T1_T2, 
  region: ROI, 
  scale: 30, 
  maxPixels: 1e13})
  .setSeriesNames(['LANDSAT T1', 'LANDSAT T2'])
  .setOptions({title: 'LANDSAT NDVI Histograms for T1 and T2',
               hAxis: {title: 'NDVI', 
                       titleTextStyle: {italic: false, bold: true}},
               vAxis: {title: 'Count', 
                       titleTextStyle: {italic: false, bold: true}},
               colors: ['cf513e', '1d6b99'],
               opacity:0});
print(ndvi_landsat);

//NDVI calculation for timeseries
var ndvi_func = function (i) {
      var ndvi = i.normalizedDifference (['B4', 'B3']).rename ('NDVI');
      return i.addBands(ndvi);
    };

var ndvi_landsat = landsat.map(ndvi_func).filterDate('2000-01-01','2020-12-31'); 

var timeseries = ui.Chart.image.seriesByRegion({
  imageCollection: ndvi_landsat,
  regions: ROI,
  reducer: ee.Reducer.mean(),
  band: 'NDVI',
  scale: 30})
  .setOptions({title: 'LANDSAT 7 - NDVI',
               hAxis: {title: 'Year', 
                       titleTextStyle: {italic: false, bold: true}},
               vAxis: {title: 'NDVI', 
                       titleTextStyle: {italic: false, bold: true}},
               colors: ['red']});
print(timeseries);


\(\color{skyblue}{\textrm{- Surface Temperature}}\)

Name Moderate Resolution Imaging Spectroradiometer (MODIS) on board Aqua and Terra Thermal Infrared Sensor (TIRS) on board Landsat-8
Satellite
Spatial Resolution 1 km 30 m
Temporal Resolution daily, but provided in 8 days aggregates 16 days
Collection Time ~11:30 am and ~11:30 pm local time ~10:30 am local time
// --------------------------------
// ----- MODIS --------------------
// --------------------------------

//Select ROI
var ROI = ee.FeatureCollection("users/rmb623/nyc");
Map.addLayer(ROI, {}, 'ROI', 0);
Map.centerObject(ROI, 9);

//Select time
var T1 = "2016-07-01";
var T2 = "2016-07-10";

//Create heat palette
var pal = ['040274', '040281', '0502a3', '0502b8', '0502ce', '0502e6',
           '0602ff', '235cb1', '307ef3', '269db1', '30c8e2', '32d3ef',
           '3be285', '3ff38f', '86e26f', '3ae237', 'b5e22e', 'd6e21f',
           'fff705', 'ffd611', 'ffb613', 'ff8b13', 'ff6e08', 'ff500d',
           'ff0000', 'de0101', 'c21301', 'a71001', '911003'];

//Function to convert K to C 
function celcius_modis(img){
  return img.multiply(0.02).subtract(273.15)
    .rename(['modis_day_celcius', 'modis_night_celcius'])
    .copyProperties(img, img.propertyNames());
}

//Load data (MODIS/MOD11A2 for pre-2017)
var modis = ee.ImageCollection('MODIS/MOD11A2')
              .filterDate(T1 , T2)
              .select(['LST_Day_1km', 'LST_Night_1km']) 
              .map(celcius_modis);

//Separate day and night
var modis_day = modis.select('modis_day_celcius').mean().clip(ROI);
var modis_night = modis.select('modis_night_celcius').mean().clip(ROI);

Map.addLayer(modis_day, {min:20, max:40 , palette: pal}, 'Modis Day');  
Map.addLayer(modis_night, {min:20, max:40 , palette: pal}, 'Modis Night');

//Load another collection (MODIS/006/MOD11A2 for 2000-present)
var modis_chart = ee.ImageCollection('MODIS/006/MOD11A2')
                    .filterDate('2010-01-01', '2021-12-31') 
                    .select(['LST_Day_1km','LST_Night_1km'])
                    .map(celcius_modis);

//Create timeseries for day (red) and night (blue)
var heat_time = ui.Chart.image.series({
  imageCollection: modis_chart,
  region: ROI,
  reducer: ee.Reducer.mean(), 
  scale: 1000})
  .setOptions({title: 'MODIS DAY & NIGHT (celcius)',
               hAxis: {title: 'Year', 
                       titleTextStyle: {italic: false, bold: true}},
               vAxis: {title: 'Temperature (°C)',
                       titleTextStyle: {italic: false, bold: true}},
               colors: ['red', 'blue']});
print(heat_time);

// --------------------------------
// ----- LANDSAT ------------------
// --------------------------------

//Select ROI
var ROI = ee.FeatureCollection("users/rmb623/nyc");
Map.addLayer(ROI, {}, 'ROI', 0);
Map.centerObject(ROI, 9);

//Select time
var T1 = "2016-07-01";
var T2 = "2016-07-10";

//Create heat palette
var pal = ['040274', '040281', '0502a3', '0502b8', '0502ce', '0502e6',
           '0602ff', '235cb1', '307ef3', '269db1', '30c8e2', '32d3ef',
           '3be285', '3ff38f', '86e26f', '3ae237', 'b5e22e', 'd6e21f',
           'fff705', 'ffd611', 'ffb613', 'ff8b13', 'ff6e08', 'ff500d',
           'ff0000', 'de0101', 'c21301', 'a71001', '911003'];

//Function applying scalling and offset factor
function celcius_landsat(img){
  return img.addBands(img.multiply(0.00341802) // scale
                         .add(149.0) // offset
                         .subtract(273.15)
                         .rename('landsat_day_celcius'));
}

//Load data, selecting images with less than 15% cloud cover 
var landsat = ee.ImageCollection('LANDSAT/LC08/C02/T1_L2')
                .filter(ee.Filter.lt('CLOUD_COVER',15)) 
                .select('ST_B10')
                .map(celcius_landsat) 
                .select('landsat_day_celcius');

//Filter by date (T1 - T2)
var landsat_day = landsat.filterDate(T1,T2).mean().clip(ROI);
Map.addLayer(landsat_day, {min:20, max:45 , palette: pal}, 'Landsat Day');

//Plot time series
var landsat_chart = landsat.filterDate('2010-01-01', '2021-12-31');

var landsat_time = ui.Chart.image.series({
  imageCollection: landsat_chart,
  region: ROI,
  reducer: ee.Reducer.max(), 
  scale: 1000})
  .setOptions({title: 'LANDSAT DAY (celcius)',
               hAxis: {title: 'Year', 
                       titleTextStyle: {italic: false, bold: true}},
               vAxis: {title: 'Temperature (°C)',
                       titleTextStyle: {italic: false, bold: true}},
               colors: ['red']});
print(landsat_time);

// --------------------------------
// ----- Profile Line -------------
// --------------------------------
//Create a point profile line 
function getRange(start, end, step) {  
    var range = [];  
    while (step > 0 ? end >= start : end <= start) {  
        range.push(start);  
        start += step;  
    }  
return range;  
}

var y = 40.6809; // the latitude of the profile line  
var x1 = -74.0119; // the longitude of profile line beginning point  
var x2 = -73.7325; // the longitude of profile line end point  
var N = 1000; // the number of samples on the profile line  

//Get coordinate points
var R = getRange(x1,x2,(x2-x1)/N);  

//Transform coordinates into a FeatureCollection
var points = ee.FeatureCollection( R.map(function(i){
  var point = ee.Geometry.Point([ee.Number(i), ee.Number(y)]) // create a new point feature with R[i] as longitude and y as latitude
  return(ee.Feature(point).set({
    lon:ee.Number(i), // add attributes lon
    lat:ee.Number(y) // add attributes lat
  })) 
}))

Map.addLayer(points, {}, 'points');

//Stack all bands
var stack = modis_day
  .addBands([modis_night, landsat_day])
  .rename(['modis_day', 'modis_night', 'landsat_day']);

//Get temperature at each point
var collection = stack.reduceRegions({
  reducer: ee.Reducer.max(),  
  collection: points,  
  scale: 1}); 

//Plot a scatter plot of the Modis profile line
var chart = ui.Chart.feature.byFeature({
  features: collection,
  xProperty: 'lon', // use longitude as the X axis
  yProperties: ['modis_day','modis_night']})  // use Temperature as the y axis
  .setChartType('ScatterChart')
  .setOptions({title: 'Temperature Profile Line Modis',
               hAxis: {title: 'Longitude', 
                       titleTextStyle: {italic: false, bold: true},
               viewWindow: {min: x1, max: x2}}, // x axis limit to start & end of the line
               vAxis: {title: 'Temperature (°C)',
                       titleTextStyle: {italic: false, bold: true}},
               pointSize: 1,
               colors: ['red', 'blue']});
print(chart);

//Plot a scatter plot of the Landsat profile line
var chart = ui.Chart.feature.byFeature({
  features: collection,
  xProperty: 'lon', // use longitude as the X axis
  yProperties: ['landsat_day']})  // use Temperature as the y axis
  .setChartType('ScatterChart')
  .setOptions({title: 'Temperature Profile Line Landsat',
               hAxis: {title: 'Longitude', 
                       titleTextStyle: {italic: false, bold: true},
               viewWindow: {min: x1, max: x2}}, // x axis limit to start & end of the line
               vAxis: {title: 'Temperature (°C)',
                       titleTextStyle: {italic: false, bold: true}},
               pointSize: 1,
               colors: [ 'orange']});
print(chart);


\(\color{dodgerblue}{\textbf{Active Sensors}}\)

\(\color{skyblue}{\textrm{- Synthetic Aperture Radar}}\)

Synthetic Aperture Radar (SAR) uses microwaves meaning it is weather independent (i.e., clouds have no impact) and can be collected during the day or the night.

Copernicus (TerraSAR-X & TanDEM-X) Shuttle Radar Topography Mission (SRTM) Advanced Land Observing Satellite (ALOS)
Worldwide at 30m planar resolution Worldwide at 30m planar resolution Worldwide at 30m planar resolution
2019 2000 2012


Surface Roughness and Backscattering

The strength of the return, or backscatter, is partially based upon relative roughness of the surface imaged. The smoother the surface, the more reflection away from the sensor, while rough surfaces give a much stronger return towards the imaging platform.

However, there are additional types of bounce mechanisms beyond specular and diffuse. In vegetation, volumetric scattering occurs when signals bounce around inside the vegetation imaged. In urban areas, the double bounce mechanism causes a strong bounce back to the sensor.


Wavelength

The wavelength of the SAR system influences the amount of ground penetration that occurs. X-band has the least penetration, scattering from the top of the canopy in vegetated areas. All three bands will penetrate dry sand, with stronger returns from both C-band and L-band. L-band has the most penetration overall, with returns from the ground in vegetated areas, strong returns from substances under dry alluvium, and deep penetration of ice and snow.


Polarization

Polarization refers to the direction of travel of an electromagnetic wave. A horizontal wave is transmitted so that it oscillates in a plane parallel to the surface imaged, while a vertical wave oscillates in a plane perpendicular to the surface imaged. There are four different polarization combinations commonly used by SAR sensors: VV, VH, HV and HH. The first letter indicates the polarization used to transmit the signal and the second letter indicates the polarization of the measured return. Polarimetry is an emerging field of SAR processing, used in a number of applications such as measuring vegetation properties, oceanography, geology, and disaster response.


// --------------------------------
// ----- SURFACE CLASSIFICATION ---
// --------------------------------
// ----- SET UP -------------------
// ROA for  Bangladesh Flood 
var centerX = 91.103909, centerY = 24.64874; 
var post_start =  '2016-07-18';  
var post_end =  '2016-07-30';
var pre_start= '2016-01-30';
var pre_end = '2016-03-30';
var width_roi = 1.5, height_roi = 1; 
var width_plot = 0.01, height_plot = 0.01; 

// Set a bounding box for image
var box = ee.Geometry.Rectangle([centerX+width_roi, centerY+height_roi,  
                                centerX-width_roi, centerY-height_roi]);

// Set a bounding box for time series plot
var roi_plot = ee.Geometry.Rectangle([centerX+width_plot, centerY+height_plot,  
                                      centerX-width_plot, centerY-height_plot]);                                  

Map.setCenter(centerX, centerY, 5);

// ----- SAR DATA -----------------
/*
1. instrumentMode = IW means Interferometric Wide Swath; a process of capturing data
2. transmitterReceiverPolarisation = polarization of the signal; use VV or HH
   * VV = verticle transmit and verticle receive
   * HH = horizontal transmission and horizontal receive
   We generally use VV for flood detection and Urban change detection because it 
   appears dark for water and brighter for settlement.
3. orbitProperties_pass = the direction of the satellite with respect to earth;
   chose either DESCENDING or ASCENDING
*/
var collectionVV = ee.ImageCollection('COPERNICUS/S1_GRD')
    .filter(ee.Filter.eq('instrumentMode', 'IW'))
    .filter(ee.Filter.listContains('transmitterReceiverPolarisation', 'VV'))
    .select(['VV'])
    .filter(ee.Filter.eq('orbitProperties_pass', 'DESCENDING'));

// ----- CALCULATIONS -------------
//Select one image from each month
var before = ee.Image(collectionVV.filterDate(pre_start, pre_end).mean().clip(box));
  
var after = ee.Image(collectionVV.filterDate(post_start, post_end).mean().clip(box));

//Subtact backscatter value of each month with March 2015
var diff = before.subtract(after).clip(box);
//var diff = (before.subtract(after.abs()).clip(box)

//Mask changes
var cumulative_mask_l = (diff.abs()).gt(4);
var SAR_masked = diff.abs().updateMask(cumulative_mask_l);

// Plot
Map.addLayer(box, {}, 'ROI for change detection');
Map.addLayer(roi_plot, {}, 'ROI for timeseries plot');
Map.addLayer(before, {min: -15, max: 0}, 'SAR_pre');
Map.addLayer(after, {min: -15, max: 0}, 'SAR_post');
Map.addLayer(SAR_masked, {min: -10, max: -7, palette: ['red']}, 'SAR_Change_detection');


\(\color{skyblue}{\textrm{- LiDAR}}\)

RADAR SONAR LIDAR
Radio Detection and Ranging Sound Navigation and Ranging Light Detection and Ranging
Uses radio waves Uses sound waves Uses lasers/infrared waves
Used for air traffic control and speed detection Used to measure the ocean flood and located submarines Used in autonomous driving and elevation detection


\(\color{skyblue}{\textrm{- Elevation}}\)

Digital Surface Model (DSM) Digital Elevation Model (DEM)
Captures both the natural and built/artificial features of the environment Represents the bare-Earth surface, removing all natural and built features. A Digital Terrain model (DTM) augments a DEM by including vector features of the natural terrain, such as rivers and ridges.


// --------------------------------
// ----- SURFACE MODEL ------------
// --------------------------------
// Create ROI
var lon = -73.949580, lat = 40.612130; 
var width = 0.05, height = 0.01;
var ROI = ee.Geometry.Rectangle([lon+width, lat+height,  
                                 lon-width, lat-height]);
Map.centerObject(ROI, 13);


// ----- COPERNICUS DSM -----------
// Copernicus Glo-30 DSM created from 2016 Sentinel 1 dataset (SAR)
var copernicus_dsm = ee.ImageCollection('projects/sat-io/open-datasets/GLO-30')
                       .mosaic()
                       .setDefaultProjection('EPSG:3857', null, 30);
Map.addLayer(copernicus_dsm, {min: 0, max: 50.0}, 'Copernicus DSM 30m');


// ----- SRTM DSM -----------------
// DSM from the Shuttle Radar Topography Mission (SRTM) from 2000 (SAR)
// Fill in the masked water area by using .unmask()
var srtm_dsm = ee.Image('CGIAR/SRTM90_V4')
                 .select('elevation')
                 .unmask();
Map.addLayer(srtm_dsm, {min: 0, max: 50.0}, 'SRTM DSM 90m');


// ----- ALOS DSM -----------------
// ALOS World 3D by JAXA collected between 2006-2011 (SAR)
var alos_dsm = ee.Image('JAXA/ALOS/AW3D30/V2_2')
                 .select('AVE_DSM');
Map.addLayer(alos_dsm, {min: 0, max: 50.0}, 'ALOS DSM 30m');


// ----- USGS DEM ----------
// LiDAR-based DEM from the USGS 3D Elevation Program
var usgs_3dep_dem = ee.Image('USGS/3DEP/10m');
Map.addLayer(usgs_3dep_dem, {min: 0, max: 50.0}, 'USGS 3DEP DEM 10m');


// --------------------------------
// ----- PROFILE LINE -------------
// --------------------------------
// Create a line based on lat long
function getRange(start, end, step) {  
    var range = [];  
    while (step > 0 ? end >= start : end <= start) {  
        range.push(start);  
        start += step;  
    }  
return range;  
}

var y  = 40.6116; //latitude of the profile line  
var x1 = -74.1988; //longitude of profile line beginning point  
var x2 = -73.7325; //longitude of profile line end point  
var N = 2000; //number of samples on the profile line  

// Apply the function to get the coordinate points
var R = getRange(x1,x2,(x2-x1)/N);  

// Transform coordinates into a FeatureCollection
var points = ee.FeatureCollection(R.map(function(i){
  var point = ee.Geometry.Point([ee.Number(i), ee.Number(y)]); 
  return(ee.Feature(point).set({
    lon:ee.Number(i), 
    lat:ee.Number(y) 
  })); 
}));

Map.addLayer(points, {color:'red'}, 'points');

// Get values at each point and stack the images into a single image
var stack = srtm_dsm
  .addBands([usgs_3dep_dem, alos_dsm , copernicus_dsm])
  .rename(['DSM SRTM', 'DEM USGS','DSM ALOS', 'DSM Copernicus']);

// Get value at each points and store them as a column
var collection = stack.reduceRegions({  
    reducer: ee.Reducer.max(),  
    collection: points,  
    scale: 1}); 

// Compare ALOS, SRTM Copernicus, and USGS
var chart = ui.Chart.feature.byFeature({
  features: collection,
  xProperty: 'lon',
  yProperties:  ['DEM USGS', 'DSM Copernicus', 'DSM SRTM', 'DSM ALOS']})
  .setChartType('LineChart')
  .setOptions({title: 'Elevation ALOS, Copernicus DSM vs USGS',
               hAxis: {title: 'Longitude', 
                      titleTextStyle: {italic: false, bold: true},
               viewWindow: {min: x1, max: x2}},
               vAxis: {title: 'Elevation (m)',
                       titleTextStyle: {italic: false, bold: true}},
               series: {0: {lineWidth: 2, color: 'red'},
                        1: {lineWidth: 2, color: 'green'},
                        2: {lineWidth: 4, color: 'orange'},
                        3: {lineWidth: 4, color: 'blue'}
                        }});
print(chart);


\(\color{darkblue}{\textbf{GHG Emissions}}\)


\(\color{dodgerblue}{\textbf{Climate Change}}\)


\(\color{dodgerblue}{\textbf{Observation}}\)


\(\color{dodgerblue}{\textbf{Data Sources}}\)


\(\color{dodgerblue}{\textbf{Solar Potential}}\)

Skyview Factor

\(\color{darkblue}{\textbf{Air Pollution}}\)


\(\color{dodgerblue}{\textbf{Criteria Air Pollutants}}\)

The Clean Air Act requires EPA to set National Ambient Air Quality Standards (NAAQS) for six common air pollutants (also known as “criteria air pollutants”). These pollutants are found all over the U.S. They can harm your health and the environment, and cause property damage.

Pollutant Common Sources Maximum Acceptable Concentration Environmental Risks Human Health Risks
Carbon Monoxide (CO) Automobile emissions, fires, industrial processes 35 ppm (1-hour period); 9 ppm (8-hour period) Contributes to smog formation Exacerbates symptoms of heart disease, such as chest pain; may cause vision problems and reduce physical and mental capabilities in healthy people
Nitrogen Oxides (NO and NO2) Automobile emissions, electricity generation, industrial processes 0.053 ppm (1-year period) Contributes to acid rain formation, which subsequently damages foliage, buildings, and monuments; reacts to form particulate matter; contributes to smog formation Inflammation and irritation of breathing passages
Sulfur Dioxide (SO2) Electricity generation, fossil-fuel combustion, industrial processes, automobile emissions 0.03 ppm (1-year period); 0.14 ppm (24-hour period) Major cause of haze; contributes to acid rain formation, which subsequently damages foliage, buildings, and monuments; reacts to form particulate matter Breathing difficulties, particularly for people with asthma and heart disease
Ozone (O3) Nitrogen oxides (NOx) and volatile organic compounds (VOCs) from industrial and automobile emissions, gasoline vapors, chemical solvents, and electrical utilities 0.075 ppm (8-hour period) Interferes with the ability of certain plants to respire, leading to increased susceptibility to other environmental stressors (e.g., disease, harsh weather) Reduced lung function; irritation and inflammation of breathing passages
Particulate matter Sources of primary particles include fires, smokestacks, construction sites, and unpaved roads; sources of secondary particles include reactions between gaseous chemicals emitted by power plants and automobiles 150 μg/m3 (24-hour period for particles <10 μm); 35 μg/m3 (24-hour period for particles <2.5 μm) Contributes to formation of haze as well as acid rain, which changes the pH balance of waterways and damages foliage, buildings, and monuments Irritation of breathing passages, aggravation of asthma, irregular heartbeat
Lead (Pb) Metal processing, waste incineration, fossil-fuel combustion 0.15 μg/m3 (rolling three-month average); 1.5 μg/m3 (quarterly average) Loss of biodiversity, decreased reproduction, neurological problems in vertebrates Adverse effects upon multiple bodily systems; may contribute to learning disabilities when young children are exposed; cardiovascular effects in adults

\(\color{dodgerblue}{\textbf{Observation}}\)

Remote Sensing

Ground-based Sensors


\(\color{dodgerblue}{\textbf{Data Sources}}\)

\(\color{darkblue}{\textbf{Administrative Data}}\)


\(\color{dodgerblue}{\textbf{Open Data}}\)


\(\color{dodgerblue}{\textbf{Population Density}}\)

The Gridded Population of the World, (GPWv4)

  • Models the distribution of human population (counts and densities) on a continuous global raster surface
  • Population input data were collected at the most detailed spatial resolution available from the results of the 2010 round of Population and Housing Censuses, which occurred between 2005 and 2014
  • Year estimates available: 2000, 2005, 2010, 2015, 2020
Observations Count Density
//Load data
var pop_collection = ee.ImageCollection("CIESIN/GPWv411/GPW_UNWPP-Adjusted_Population_Count")
    .select('unwpp-adjusted_population_count');
    
//Choose date range
var T1_start = '2000-01-01';
var T1_ends = '2000-12-31';

var T2_start = '2020-01-01';
var T2_ends = '2020-12-31';

//Pull population for date range
var T1_pop = pop_collection.filterDate(T1_start, T1_ends).first();
var T2_pop  = pop_collection.filterDate(T2_start, T2_ends).first(); 

//Calculate population change 
var T2T1_pop_change = T2_pop.subtract(T1_pop);

//Plot
Map.setCenter(-74.0060, 40.7128, 9); //New York, United States
Map.addLayer(T1_pop, {min: 0, max: 2000, palette: [ 'ffffff', 'red' ]}, 'Population T1');
Map.addLayer(T2_pop, {min: 0, max: 2000, palette: [ 'ffffff', 'red' ]}, 'Population T2');
Map.addLayer(T2T1_pop_change, { min:-300, max: 300, palette: ['blue','black','red']}, 'Pop Change T1-T2');

//Select ROI
var ROI = ee.FeatureCollection("users/rmb623/nyc");
Map.addLayer(ROI, {}, 'ROI', 0);
Map.centerObject(ROI, 9);

//Summary statistics  
var changeStats = T2T1_pop_change.reduceRegion(
  {reducer: ee.Reducer.mean()
            .combine({reducer2: ee.Reducer.stdDev(), sharedInputs: true})
            .combine({reducer2: ee.Reducer.percentile({percentiles:[25,50,75]}), sharedInputs: true})
            .combine({reducer2: ee.Reducer.count(), sharedInputs: true}),
  geometry: ROI.geometry()});
  
print(changeStats);

//Plot total population
var pop_total = ui.Chart.image.series(
  pop_collection, 
  ROI, 
  ee.Reducer.sum()) //.mean() can be used for denisty
  .setOptions({title: 'Total Population of NYC',
               vAxis: {textStyle: {fontSize: 14}},
               hAxis: {title: 'Year', format: 'yyyy', gridlines: {count: 7}, 
               titleTextStyle: {italic: false, bold: true, fontSize:14}, 
               textStyle: {fontSize: 14}}});
print(pop_total);

Return to Spatial Page